package org.jianfa.rpc.server.decoder;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;
import org.jianfa.learn.common.serializer.Serializer;

import java.util.List;

public class RpcDecoder extends ByteToMessageDecoder {

    private Class<?> clazz;

    private Serializer serializer;

    public RpcDecoder(Class<?> clazz, Serializer serializer) {
        this.clazz = clazz;
        this.serializer = serializer;
    }

    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {

        //因为我们远程调用的字节流包括两个部分。
        //第一个部分是字节流的长度，4个字节。
        //第二部分是RpcRequest JSON化之后的长度。该长度记录在前4个字节里面。

        //只有在可读字节流的长度大于等于4，才开始处理
        if (in.readableBytes() >= 4) {
            int length = in.getInt(0);

            //首先读取长度信息
            int readableBytes = in.readableBytes();

            //只有在可读字节流包含完成的JSON信息之后，才开始进行反序列化。
            if (readableBytes >= (length + 4)) {

                byte[] bytes = new byte[length];

                in.skipBytes(4);
                in.readBytes(bytes);
                out.add(serializer.deserialize(clazz, bytes));
            }
        }
    }
}
